package com.kingbook.core.result;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.kingbook.common.utils.CollectionUtils;
import com.kingbook.core.enums.ResultCode;
import com.google.common.collect.Lists;

import java.io.Serializable;
import java.lang.reflect.Array;
import java.util.Collection;

import static com.kingbook.core.enums.ResultCode.FAILED;
import static com.kingbook.core.enums.ResultCode.SUCCESS;

/**
 * @Author: Bucky
 * @Date: 2019/1/2
 * @Version 1.0
 */
public class JSONResult extends Result<JSONArray> implements Serializable {

    private static final long serialVersionUID = 8620041458043684609L;


    protected JSONResult(ResultCode code, String msg, JSONArray data) {
        super(code, msg, data != null ? data.size() : 0, data);
    }

    public static JSONResult success() {
        return success(SUCCESS.name());
    }

    public static JSONResult successWithCount(int count) {
        JSONResult result = new JSONResult(SUCCESS, "", new JSONArray());
        result.setCount(count);
        return result;
    }

    public static JSONResult success(String msg) {
        return new JSONResult(SUCCESS, msg, new JSONArray());
    }

    public static JSONResult success(String msg, JSONArray data) {
        return new JSONResult(SUCCESS, msg, data);
    }

    public static JSONResult success(String msg, JSONObject obj) {
        JSONArray ja = new JSONArray();
        ja.add(obj);
        return new JSONResult(SUCCESS, msg, ja);
    }

    public static JSONResult success(Object obj) {
        return success("", obj);
    }

    public static JSONResult success(String msg, Object obj) {
        return newInObj(SUCCESS, msg, obj);
    }

    public static JSONResult failed() {
        return failed(FAILED.toString());
    }

    public static JSONResult failed(String msg) {
        return failed(FAILED, msg);
    }

    public static JSONResult failed(ResultCode code, String msg) {
        return new JSONResult(code, msg, new JSONArray());
    }

    public static JSONResult failed(String msg, JSONObject obj) {
        JSONArray ja = new JSONArray();
        ja.add(obj);
        return new JSONResult(FAILED, msg, ja);
    }

    private static JSONResult newInObj(ResultCode code, String msg, Object obj) {
        JSONArray ja = new JSONArray();
        if (obj != null) {
            if (Collection.class.isInstance(obj)) {
                if (!CollectionUtils.isEmpty((Collection<?>) obj)) {
                    ja.addAll((Collection<?>) obj);
                }
            } else if (obj.getClass().isArray()) {
                if (Array.getLength(obj) > 0) {
                    ja.addAll(Lists.newArrayList((Object[]) obj));
                }
            } else {
                ja.add(obj);
            }
        }
        return new JSONResult(code, msg, ja);
    }

    @Override
    public JSONArray getData() {
        return data;
    }

    /**
     * 获取data元素的属性值，如果有多条，返回第一条中的属性值
     *
     * @param jsonKey
     * @return
     */
    public String getDataElement(String jsonKey) {
        return getDataElement(0, jsonKey);
    }

    /**
     * 获取data元素的属性值，如果有多条，返回第一条中的属性值 确认不为String
     *
     * @param jsonKey
     * @return
     */
    public String getDataElementForMap(String jsonKey) {
        return getDataElementForMap(0, jsonKey);
    }

    /**
     * 获取data元素的属性值，如果有多条，返回第一条中的属性值
     *
     * @param jsonKey
     * @return
     */
    public Object getDataElementForObject(String jsonKey) {
        return getDataElementForObject(0, jsonKey);
    }

    /**
     * 获取data元素的属性值，index从0开始
     *
     * @param index
     * @param jsonKey
     * @return
     */
    public String getDataElement(int index, String jsonKey) {
        if (getData() == null || getData().size() == 0)
            return null;
        JSONObject jb = getData().getJSONObject(index);
        if (jb != null && jb.containsKey(jsonKey))
            return jb.getString(jsonKey);
        return null;
    }

    public String getDataElementForMap(int index, String jsonKey) {
        if (getData() == null || getData().size() == 0)
            return null;
        JSONObject jb = getData().getJSONObject(index);
        if (jb != null && jb.containsKey(jsonKey))
            return jb.getJSONObject(jsonKey).toJSONString();
        return null;
    }

    public Object getDataElementForObject(int index, String jsonKey) {
        if (getData() == null || getData().size() == 0)
            return null;
        JSONObject jb = getData().getJSONObject(index);
        if (jb != null && jb.containsKey(jsonKey))
            return jb.get(jsonKey);
        return null;
    }

    @Override
    public String toString() {
        return String.format("{\"code\":%s,\"msg\":\"%s\",\"count\":%s,\"data\":%s}", getCode(), getMsg(), getCount(), getData());
    }
}
